//package cn.zasoft.service.impl;
//
//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.core.lang.Snowflake;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.json.JSONArray;
//import cn.hutool.json.JSONObject;
//import cn.zasoft.common.Result;
//import cn.zasoft.constant.SystemConstant;
//import cn.zasoft.exception.BusinessException;
//import cn.zasoft.mapper.AccountMapper;
//import cn.zasoft.pojo.dto.AccountDTO;
//import cn.zasoft.pojo.dto.RecordDTO;
//import cn.zasoft.pojo.entity.Account;
//import cn.zasoft.pojo.entity.Record;
//import cn.zasoft.pojo.entity.RecordYoutube;
//import cn.zasoft.pojo.vo.SingleAccountData;
//import cn.zasoft.service.RecordService;
//import cn.zasoft.service.RecordYoutubeService;
//import cn.zasoft.service.TidalDataService;
//import cn.zasoft.utils.DownloadPic;
//import cn.zasoft.utils.utils.Utils;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import lombok.extern.slf4j.Slf4j;
//import lombok.val;
//import org.jsoup.Jsoup;
//import org.jsoup.nodes.DataNode;
//import org.jsoup.nodes.Document;
//import org.jsoup.nodes.Element;
//import org.jsoup.select.Elements;
//import org.openqa.selenium.By;
//import org.openqa.selenium.Cookie;
//import org.openqa.selenium.Dimension;
//import org.openqa.selenium.JavascriptExecutor;
//import org.openqa.selenium.WebElement;
//import org.openqa.selenium.chrome.ChromeDriver;
//import org.openqa.selenium.chrome.ChromeOptions;
//import org.springframework.context.annotation.Lazy;
//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
//import org.springframework.stereotype.Service;
//import org.springframework.util.StringUtils;
//
//import javax.annotation.Resource;
//import java.time.Duration;
//import java.time.LocalDateTime;
//import java.time.LocalTime;
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.List;
//import java.util.Objects;
//import java.util.Optional;
//import java.util.concurrent.ExecutionException;
//import java.util.concurrent.Future;
//import java.util.concurrent.atomic.AtomicReference;
//import java.util.stream.Collectors;
//
///**
// * @author admin
// */
//@Service
//public class TidalDataServiceImpl extends ServiceImpl<AccountMapper, Account> implements TidalDataService {
//
//    @Resource
//    @Lazy
//    private RecordYoutubeService recordService;
//
//    @Resource
//    @Lazy
//    private RecordService recordFansService;
//
//    /**
//     * 获取潮汐数据，并且指定开启多少个端口,爬的数据是月还是天
//     *
//     * @param portDriver 开启多少个driver
//     * @param time       爬几天的数据
//     * @param company    单位是天还是年还是月
//     * @param code       用于测试账号
//     */
//    @Override
//    public void getTidalData(Integer portDriver, Integer time, String company, String code) {
//        if (portDriver > 10) {
//            throw new BusinessException(500, "最多只能3个端口");
//        }
//        LambdaQueryWrapper<Account> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        lambdaQueryWrapper.select(Account::getAccountCode);
//        lambdaQueryWrapper.eq(Account::getPlatformId, 2);
//        lambdaQueryWrapper.eq(Account::getAccountFree, 2);
//        if (!StringUtils.isEmpty(code)) {
//            lambdaQueryWrapper.eq(Account::getAccountCode, code);
//        }
//        List<Account> accountList = list(lambdaQueryWrapper);
//        for (Account account : accountList) {
//            String path;
//            path = "https://www.youtube.com/@" + account.getAccountCode();
//            if (account.getAccountCode().contains("channel")) {
//                path = "https://www.youtube.com/" + account.getAccountCode();
//            }
//
//            try {
//                getAccountData(path, portDriver, time, company, account.getAccountCode());
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//
//        }
//    }
//
//    /**
//     * 检测账号
//     *
//     */
//    @Override
//    public void getDetectionAccount(String code) {
//        LambdaQueryWrapper<Account> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        lambdaQueryWrapper.select(Account::getAccountCode, Account::getAccountId);
//        lambdaQueryWrapper.eq(Account::getPlatformId, 2);
//        if (!StringUtils.isEmpty(code)) {
//            lambdaQueryWrapper.eq(Account::getAccountCode, code);
//        }
//        List<Account> accountList = list(lambdaQueryWrapper);
//        for (Account account : accountList) {
//            String path = "https://www.youtube.com/@" + account.getAccountCode() + "/videos";
//            try {
//                getDetectionAccountInfo(account, path);
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//
//        }
//    }
//
//    /**
//     * 根基单账号检索code的子账号
//     * 使用滚动的方法
//     * @param singleAccountData 账号数据
//     */
//    @Override
//    public Result getSingleAccount(SingleAccountData singleAccountData) {
//        // 查询账号是否存在
//        LambdaQueryWrapper<Account> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        lambdaQueryWrapper.eq(Account::getAccountCode, singleAccountData.getCode());
//        lambdaQueryWrapper.eq(Account::getPlatformId, 2);
//        lambdaQueryWrapper.select(Account::getAccountId, Account::getAccountCode);
//        lambdaQueryWrapper.last("limit 1");
//        Account account = getOne(lambdaQueryWrapper);
//        if (account == null) {
//            return Result.error().message("账号不存在！");
//        }
//        ChromeDriver driver = startChromeDrive();
//        if (driver == null) {
//            return Result.error().message("启动Driver驱动失败！");
//        }
//        String path = "https://www.youtube.com/@" + singleAccountData.getCode() + "/videos";
//        List<Element> elementList = new ArrayList<>();
//        try {
//            // 设置隐式等待时间为10秒
//            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
//            driver.get(path);
//            getPageData(driver, singleAccountData, elementList);
//        } catch (Exception e) {
//            log.error("Failed to obtain account link");
//            e.printStackTrace();
//            driver.quit();
//        }
//        if (elementList.isEmpty()) {
//            return Result.ok().message("当前账号无符合条件的数据！");
//        }
//        driver.quit();
//        //todo完善子查询的
//        return Result.ok().data(elementList);
//    }
//
//    /**
//     * 获取页面数据
//     * @param driver 驱动
//     * @param singleAccountData 数据
//     * @param elementList       列表的数据
//     */
//    private void getPageData(ChromeDriver driver, SingleAccountData singleAccountData, List<Element> elementList) {
//        int i = 0;
//        // 懒加载页面,滚动获取页面元素,找到匹配内容或到达页面底部退出
//        while (true) {
//            i++;
//            // 获取滚动之前的页面数据后继续滚动页面
//            String beforeSource = driver.getPageSource();
//            // 进行页面的滚动
//            Dimension window = driver.manage().window().getSize();
//            Document document = Jsoup.parse(driver.getPageSource(), "utf-8");
//            Element doc = document.body();
//            Elements elements = doc.select("#dismissible");
//            boolean flag = false;
//            for (Element element : elements) {
//                boolean f;
//                Elements elementsByClass = element.getElementsByClass("inline-metadata-item style-scope ytd-video-meta-block");
//                if (elementsByClass.text().contains("首播时间")) {
//                    continue;
//                }
//                if (elementsByClass.isEmpty()) {
//                    continue;
//                }
//                String time = elementsByClass.get(1).text();
//                // 判断是否是要时间的
//                if (!(StringUtils.isEmpty(singleAccountData.getTimeUnit()) && StringUtils.isEmpty(singleAccountData.getTimeUnit()))) {
//                    f = Utils.validateTime(time, singleAccountData.getSearchDays(), singleAccountData.getTimeUnit());
//                    // 如果第一个就没有天就可以结束了
//                    if (!f) {
//                        // 有一个元素不符合就结束
//                        flag = true;
//                        break;
//                    }
//                }
//            }
//            if (flag) {
//                elementList.addAll(elements);
//                break;
//            }
//            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//            long height = window.height * i;
//            ((JavascriptExecutor) driver).executeScript("window.scrollTo(0," + height + ")");
//            // 获取滚动页面后的元素
//            String afterSource = driver.getPageSource();
//            // 比较滚动前和滚动后的页面元素,一样则代表到达页面底部,退出循环
//            if (beforeSource.equals(afterSource)) {
//                break;
//            }
//        }
//    }
//
//    /**
//     * 启动谷歌驱动
//     * @return 返回谷歌驱动
//     */
//    private ChromeDriver startChromeDrive() {
//        ChromeOptions chromeOptions = new ChromeOptions();
//        System.setProperty(SystemConstant.CHROME_DRIVER_NAME, SystemConstant.CHROME_DRIVER_103_PATH);
//        chromeOptions.addArguments("--no-sandbox");
//        chromeOptions.addArguments("--disable-gpu");
//        chromeOptions.addArguments("--allowed-ips");
//        chromeOptions.addArguments("--ignore-certificate-errors");
//        chromeOptions.addArguments("--disable-extensions");
//        chromeOptions.addArguments("--no-sandbox");
//        chromeOptions.addArguments("lang=zh_CN.UTF-8");
//        ChromeDriver driver = null;
//        try {
//            driver = new ChromeDriver(chromeOptions);
//            driver.manage().window().maximize();
//        } catch (Exception e) {
//            log.error("Driver connection failed");
//            e.printStackTrace();
//        }
//        return driver;
//
//    }
//
//    /**
//     * 检测账号
//     * @param account  暂不返回
//     */
//    private void getDetectionAccountInfo(Account account, String path) {
//        ChromeOptions chromeOptions = new ChromeOptions();
//        System.setProperty(SystemConstant.CHROME_DRIVER_NAME, SystemConstant.CHROME_DRIVER_103_PATH);
//        chromeOptions.addArguments("--no-sandbox");
//        chromeOptions.addArguments("--disable-gpu");
//        chromeOptions.addArguments("--allowed-ips");
//        chromeOptions.addArguments("--ignore-certificate-errors");
//        chromeOptions.addArguments("--disable-extensions");
//        chromeOptions.addArguments("--no-sandbox");
////        chromeOptions.addArguments("--user-data-dir=/usr/www/tools/ChromeProfile2");
//        chromeOptions.addArguments("lang=zh_CN.UTF-8");
////        chromeOptions.addArguments("lang=en");
//        ChromeDriver driver = null;
//        try {
//            driver = new ChromeDriver(chromeOptions);
//            driver.manage().window().maximize();
//        } catch (Exception e) {
//            log.error("Driver connection failed");
//            e.printStackTrace();
//        }
//        if (driver == null) {
//            log.error("Driver initialization failed");
//            return;
//        }
//        try {
//            driver.get(path);
//            chromeDriverLazy(driver, 1, "月");
//        } catch (Exception e) {
//            log.error("Failed to obtain account link");
//            e.printStackTrace();
//            driver.quit();
//        }
//        try {
//            startGetDataInfo(path, driver, account);
//        } catch (Exception e) {
//            log.error("Failed to resolve account");
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 开始获取账号信息
//     * @param path  路径
//     * @param driver 启动的driver
//     * @param account 账号信息 有账号id和code
//     */
//    private void startGetDataInfo(String path, ChromeDriver driver, Account account) {
//        Document document = null;
//        try {
//            document = Jsoup.parse(driver.getPageSource(), "utf-8");
//        } catch (Exception e) {
//            e.printStackTrace();
//            log.error("方法startGetData Failed to resolve account link");
//        } finally {
//            driver.quit();
//        }
//        if (document == null) {
//            return;
//        }
//        Element doc = document.body();
//        Elements elements = doc.select("#dismissible");
//        if (elements.size() == 0) {
//            return;
//        }
//        // 先保存看
//        List<String> newPath = new ArrayList<>();
//        for (Element element : elements) {
//            // 修改处
//            String videoPlayUrlHref = element.select("#video-title-link").select("a").attr("href");
//            String videoPlayUrl = String.format("%s%s", SystemConstant.YOU_TU_BE_PATH, videoPlayUrlHref);
//            Elements elementsByClass = element.getElementsByClass("inline-metadata-item style-scope ytd-video-meta-block");
//            if (elementsByClass.text().contains("首播时间")) {
//                continue;
//            }
//            if (elementsByClass.isEmpty()) {
//                continue;
//            }
//            String time = elementsByClass.get(1).text();
//            boolean f = Utils.validateTime(time, 1, "月");
//            // 如果第一个就没有天就可以结束了
//            if (!f) {
//                // 有一个元素不符合就结束
//                continue;
//            }
//            newPath.add(videoPlayUrl);
//        }
//        // 空就没必要继续了
//        if (newPath.isEmpty()) {
//            return;
//        }
//        LambdaQueryWrapper<RecordYoutube> recordYoutubeLambdaQueryWrapper = new LambdaQueryWrapper<>();
//        recordYoutubeLambdaQueryWrapper.select(RecordYoutube::getCommentUrl);
//        recordYoutubeLambdaQueryWrapper.eq(RecordYoutube::getAccountId, account.getAccountId());
//        recordYoutubeLambdaQueryWrapper.in(RecordYoutube::getCommentUrl, newPath);
//        List<RecordYoutube> list = recordService.list(recordYoutubeLambdaQueryWrapper);
//        if (list == null || list.isEmpty()) {
//            return;
//        }
//        List<String> collect = list.stream().map(RecordYoutube::getCommentUrl).collect(Collectors.toList());
//        // 取差集
//        List<String> reduce1 = newPath.stream().filter(item -> !collect.contains(item)).collect(Collectors.toList());
//        if (reduce1.isEmpty()) {
//            System.out.println("没有更新的数据");
//        }
//
//    }
//
//    /**
//     * @param path    链接
//     * @param time    线程数
//     * @param company 时间
//     */
//    private void getAccountData(String path, Integer portDriver, Integer time, String company, String code) {
//
//        ChromeOptions chromeOptions = new ChromeOptions();
//        System.setProperty(SystemConstant.CHROME_DRIVER_NAME, SystemConstant.CHROME_DRIVER_103_PATH);
//        chromeOptions.addArguments("--no-sandbox");
//        chromeOptions.addArguments("--disable-gpu");
//        chromeOptions.addArguments("--allowed-ips");
//        chromeOptions.addArguments("--ignore-certificate-errors");
//        chromeOptions.addArguments("--disable-extensions");
//        chromeOptions.addArguments("--no-sandbox");
//
//        chromeOptions.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
//        chromeOptions.setExperimentalOption("useAutomationExtension", false);
//
////        chromeOptions.addArguments("--user-data-dir=/usr/www/tools/ChromeProfile2");
//        chromeOptions.addArguments("lang=zh_CN.UTF-8");
////        chromeOptions.addArguments("lang=en");
//        ChromeDriver driver = null;
//        try {
//            driver = new ChromeDriver(chromeOptions);
//            driver.manage().window().maximize();
//        } catch (Exception e) {
//            log.error("Driver connection failed");
//            e.printStackTrace();
//        }
//        if (driver == null) {
//            log.error("Driver initialization failed");
//            return;
//        }
//        try {
//            driver.get(path);
//            WebElement video = driver.findElement(By.xpath("//tp-yt-paper-tab[@class='style-scope ytd-c4-tabbed-header-renderer']"));
//            // 点击音频
//            video.click();
//            chromeDriverLazy(driver, time, company);
//        } catch (Exception e) {
//            log.error("Failed to obtain account link");
//            e.printStackTrace();
//            driver.quit();
//        }
//        try {
//            startGetData(path, driver, portDriver, time, company, code);
//        } catch (Exception e) {
//            log.error("Failed to resolve account");
//            e.printStackTrace();
//        }
//
//    }
//
//    /**
//     * @param path       账号链接
//     * @param portDriver 线程数
//     */
//    private void startGetData(String path, ChromeDriver driver, Integer portDriver, Integer time, String company, String code) {
//        Document document = null;
//        try {
//            document = Jsoup.parse(driver.getPageSource(), "utf-8");
//        } catch (Exception e) {
//            e.printStackTrace();
//            log.error("方法startGetData Failed to resolve account link");
//        } finally {
//            driver.quit();
//        }
//        if (document == null) {
//            return;
//        }
////        JSONObject jsonData = getJSONData(document);
//        Element doc = document.body();
//        //获取作者信息
//        AccountDTO accountDTO = getYouTuBeUserDTOData(document);
//        if (accountDTO == null) {
//            log.error("No data found for script");
//            return;
//        }
//        if (!this.getAccountDataInfo(doc, accountDTO)) {
//            log.error("Failed to parse author information");
//            return;
//        }
//        Account account = new Account();
//        BeanUtil.copyProperties(accountDTO, account);
//        account.setAccountFan((int) Utils.stringToLong(accountDTO.getAccountFan()));
//        account.setAccountCode(code);
//        String accountId = this.exitAccount(account);
//        Elements elements = doc.select("#dismissible");
//        if (elements.size() == 0) {
//            return;
//        }
//        try {
//            this.getYouTuBeUserDTOPartialData(accountId, elements, portDriver, time, company);
//            log.info("当前账号结束" + code);
//        } catch (Exception e) {
//            log.error("Failed to get post information");
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 查询账号的子帖子数
//     *
//     * @param accountId 账号id
//     * @param elements  元素
//     * @param maxPool   线程
//     */
//    private void getYouTuBeUserDTOPartialData(String accountId, Elements elements, Integer maxPool, Integer time, String company) {
//        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//        // 核心线程数
//        executor.setCorePoolSize(maxPool);
//        // 最大线程数
//        executor.setMaxPoolSize(maxPool);
//        // 队列阿
//        executor.setQueueCapacity(maxPool);
//        // 初始化线程
//        executor.initialize();
//        // 如果maxPool 大于 elements.size() 就适用elements.size()为线程数
//        if (maxPool > elements.size()) {
//            maxPool = elements.size();
//        }
//        // 求最后剩下的账号
//        int remainder = elements.size() % maxPool;
//        // 均等分
//        int singlePoolData = elements.size() / maxPool;
//        List<Future<Integer>> futureList = new ArrayList<>();
//        // 初始化栈
//        // 初始化端口
////        int initPort = 9230;
////        Stack<StackDTO> stack = new Stack<>();
////        for (int i = 0; i <  maxPool; i++) {
////            initPort += 1;
////            StackDTO stackDTO = new StackDTO();
////            String debuggerAddress = "127.0.0.1:" + initPort;
//////            String exec = "C:\\Users\\adminx\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe --remote-debugging-port=9221 --no-sandbox --window-size=1920,1080 --start-maximized --user-data-dir=D:\\DevelopTools\\selenium\\ChromeProfile --proxy-server=127.0.0.1:7890";
////            String CHROME_RUNTIME_PATH = "C:\\Users\\17136\\AppData\\Local\\Google\\Chrome\\Application\\chrome"+i+".exe --remote-debugging-port=" + initPort + " --lang=cn --start-maximized  --user-data-dir=D:\\DevTool\\selenium\\ChromeProfile --proxy-server=127.0.0.1:7890";
//////            String CHROME_RUNTIME_PATH = "google-chrome --user-data-dir=/usr/www/tools/ChromeProfile2 --remote-debugging-port=" + initPort + " --lang=cn --no-sandbox --start-maximized --proxy-server=127.0.0.1:7890";
////            stackDTO.setAddressDebugger(debuggerAddress);
////            stackDTO.setChromeRuntimePath(CHROME_RUNTIME_PATH);
////            stack.push(stackDTO);
////        }
//
//
//        for (int i = 0; i < maxPool; i++) {
//            int start = i * singlePoolData;
//            int end = i * singlePoolData + singlePoolData - 1;
//            if (i == maxPool - 1) {
//                end += remainder;
//            }
////            StackDTO stackDTO = null;
////            // 查看栈是否为空
////            if (!stack.empty()){
////                stackDTO = stack.pop();
////            }
////            if (stackDTO == null){
////                return;
////            }
//            int finalEnd = end;
//
//            System.setProperty(SystemConstant.CHROME_DRIVER_NAME, SystemConstant.CHROME_DRIVER_103_PATH);
//            ChromeOptions chromeOptions = new ChromeOptions();
//            // ChatGPT
//            chromeOptions.addArguments("lang=zh_CN.UTF-8");
//            // chromeOptions.addArguments("lang=en");
//            chromeOptions.addArguments("--no-sandbox");
//            chromeOptions.addArguments("--disable-gpu");
//            chromeOptions.addArguments("--disable-infobars");
//            chromeOptions.addArguments("--allowed-ips");
//            chromeOptions.addArguments("--ignore-certificate-errors");
//
//            chromeOptions.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
//            chromeOptions.setExperimentalOption("useAutomationExtension", false);
//            // 用于修改中文的指定
////            chromeOptions.addArguments("--user-data-dir=/usr/www/tools/ChromeProfile2" + i);
//            // 禁用机器控制
//            chromeOptions.addArguments("--disable-extensions");
//            chromeOptions.addArguments("--no-sandbox");
//            ChromeDriver driver = null;
//            try {
//                driver = new ChromeDriver(chromeOptions);
//                driver.manage().window().maximize();
//            } catch (Exception e) {
//                log.error("帖子线程Driver connection failed");
//                e.printStackTrace();
//            }
//            if (driver == null) {
//                log.error("帖子线程Driver initialization failed");
//                continue;
//            }
//            ChromeDriver finalDriver = driver;
//            Future<Integer> submit = executor.submit(() ->
//                    {
//                        Integer count = 0;
//                        try {
//                            count = this.getPostData(start, finalEnd, elements, accountId, finalDriver, time, company);
//                        } catch (Exception e) {
//                            log.error("出错");
//                        } finally {
//                            finalDriver.quit();
//                        }
//                        return count;
//                    }
//            );
//            futureList.add(submit);
//        }
//        for (Future<Integer> integerFuture : futureList) {
//            try {
//                System.out.println("integerFuture = " + integerFuture.get());
//            } catch (InterruptedException | ExecutionException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    /**
//     * 开始获取帖子数据
//     *
//     * @param start     下标
//     * @param end       开始
//     * @param elements  结束
//     * @param accountId 账号
//     * @return 返回值
//     */
//    private Integer getPostData(int start, int end, Elements elements, String accountId, ChromeDriver driver, Integer time, String company) {
//        int count = 0;
//        for (int i = start; i < end; i++) {
//            try {
//                this.getPostDetail(elements.get(i), accountId, driver, time, company);
//            } catch (Exception e) {
//                e.printStackTrace();
//                log.error("Failed to get the post");
//            }
//            count++;
//        }
//        return count;
//    }
//
//    /**
//     * 开始获取帖子
//     *
//     * @param element   单个帖子
//     * @param accountId 账号id
//     */
//    private void getPostDetail(Element element, String accountId, ChromeDriver driver, Integer time, String company) {
//        RecordDTO youTuBeUserDTO = new RecordDTO();
//        youTuBeUserDTO.setAccountId(accountId);
//        String videoUrlAvatar = element.getElementsByClass("yt-core-image--fill-parent-height yt-core-image--fill-parent-width yt-core-image yt-core-image--content-mode-scale-aspect-fill yt-core-image--loaded").attr("src");
//        // 播放封面
//        youTuBeUserDTO.setContentUrl(videoUrlAvatar);
//        // 修改处
//        String videoPlayUrlHref = element.select("#video-title-link").select("a").attr("href");
//        String videoPlayUrl = String.format("%s%s", SystemConstant.YOU_TU_BE_PATH, videoPlayUrlHref);
//        // 播放地址
//        youTuBeUserDTO.setCommentUrl(videoPlayUrl);
//        if (videoPlayUrl.contains(SystemConstant.YOU_TU_BE_SHORT_VIDEO_ADDRESS_PATH)) {
//            try {
//                this.getShortVideoDetail(youTuBeUserDTO, driver, time, company);
//            } catch (Exception e) {
//                e.printStackTrace();
//                log.error("短视频失败");
//            }
//        } else {
//            try {
//                this.getVideoDetail(youTuBeUserDTO, driver, time, company);
//            } catch (Exception e) {
//                e.printStackTrace();
//                log.error("getPostDetail 报错");
//            }
//        }
//    }
//
//    /**
//     * 短视频
//     *
//     * @param youTuBeUserDTO youTuBeUserDTO
//     */
//    private void getShortVideoDetail(RecordDTO youTuBeUserDTO, ChromeDriver driver, Integer day, String company) {
//        JSONObject json = this.getJSON(youTuBeUserDTO.getCommentUrl(), driver);
//        if (json == null) {
//            return;
//        }
//        Object reelPlayerOverlayRenderer = new JSONObject(json.get("overlay")).get("reelPlayerOverlayRenderer");
//        Object likeButton = new JSONObject(reelPlayerOverlayRenderer).get("likeButton");
//        JSONObject likeButtonRenderer = new JSONObject(likeButton);
//        Object likeCountWithLikeText = new JSONObject(new JSONObject(likeButtonRenderer).get("likeButtonRenderer")).get("likeCountWithLikeText");
//        //点赞数
//        String likeCount = "0";
//        if (null != likeCountWithLikeText) {
//            Object simpleText = new JSONObject(likeCountWithLikeText).get("simpleText");
//            if (null != simpleText) {
//                likeCount = simpleText.toString();
//            }
//        }
//        youTuBeUserDTO.setAttitudes((int) Utils.stringToLong(likeCount));
//        //标题
//        Object reelPlayerHeaderSupportedRenderers = new JSONObject(reelPlayerOverlayRenderer).get("reelPlayerHeaderSupportedRenderers");
//        Object reelPlayerHeaderRenderer = new JSONObject(reelPlayerHeaderSupportedRenderers).get("reelPlayerHeaderRenderer");
//        Object reelTitleText = new JSONObject(reelPlayerHeaderRenderer).get("reelTitleText");
//        Object reelTitleTextRuns = ((JSONObject) reelTitleText).get("runs");
//        JSONArray relTitleTextRunsList = new JSONArray(reelTitleTextRuns);
//        AtomicReference<String> shortTitle = new AtomicReference<>("");
//        relTitleTextRunsList.forEach(v -> {
//            Object text = new JSONObject(v).get("text");
//            if (null != text) {
//                shortTitle.updateAndGet(v1 -> v1 + text);
//            }
//        });
//        String title;
//        title = shortTitle.get();
//        youTuBeUserDTO.setContent(title);
//        //评论
//        Object viewCommentsButton = new JSONObject(reelPlayerOverlayRenderer).get("viewCommentsButton");
//        Object buttonRenderer = new JSONObject(viewCommentsButton).get("buttonRenderer");
//        Object text = new JSONObject(buttonRenderer).get("text");
//        String commentView = new JSONObject(text).get("simpleText").toString();
//        if (commentView.contains("已停用")) {
//            commentView = "0";
//        }
//        youTuBeUserDTO.setCommentsCount((int) Utils.stringToLong(commentView));
//
//        Object engagementPanels = json.get("engagementPanels");
//        JSONArray engagementPanels1 = new JSONArray(engagementPanels);
//        Object engagementPanelSectionListRenderer = new JSONObject(engagementPanels1.get(1)).get("engagementPanelSectionListRenderer");
//        Object content = new JSONObject(engagementPanelSectionListRenderer).get("content");
//        Object structuredDescriptionContentRenderer = new JSONObject(content).get("structuredDescriptionContentRenderer");
//        Object items = new JSONArray(new JSONObject(structuredDescriptionContentRenderer).get("items")).get(0);
//        Object videoDescriptionHeaderRenderer = new JSONObject(items).get("videoDescriptionHeaderRenderer");
//        Object views = new JSONObject(videoDescriptionHeaderRenderer).get("views");
//        Object publishDateS = new JSONObject(videoDescriptionHeaderRenderer).get("publishDate");
//        //观看次数
//        Object viewCount = new JSONObject(views).get("simpleText");
//        //观看次数
//        String viewCounts = "0";
//        if (null != viewCount) {
//            viewCounts = viewCount.toString();
//        }
//        if (org.springframework.util.StringUtils.isEmpty(youTuBeUserDTO.getViewCount())) {
//            youTuBeUserDTO.setViewCount((int) Utils.stringToLong(viewCounts));
//        }
//        Object publishDates = new JSONObject(publishDateS).get("simpleText");
//        String publishDate;
//        //发布时间
//        publishDate = publishDates.toString();
//        if (Utils.validateLocalDateTime(youTuBeUserDTO, publishDate, day, company)) {
//            return;
//        }
//        // 保存还是修改帖子
//        this.exitRecord(youTuBeUserDTO);
//    }
//
//    /**
//     * 详细视频获取数据截取
//     *
//     * @param dataPath dataPath
//     * @return JSONObject
//     */
//    private JSONObject getJSON(String dataPath, ChromeDriver driver) {
//        driver.get(dataPath);
//        Document document = Jsoup.parse(driver.getPageSource());
//        //  获取页面资源
//        return this.getJSONData(document);
//    }
//
//    /**
//     * 获取视频的
//     *
//     * @param youTuBeUserDTO 账号路径
//     * @param driver         驱动类
//     */
//    private void getVideoDetail(RecordDTO youTuBeUserDTO, ChromeDriver driver, Integer day, String company) {
//        if (driver == null) {
//            return;
//        }
//        JSONObject json = this.getJSON(youTuBeUserDTO.getCommentUrl(), driver);
//        if (json == null) {
//            return;
//        }
//        Object twoColumnWatchNextResults = new JSONObject(json.get("contents")).get("twoColumnWatchNextResults");
//        if (null == twoColumnWatchNextResults) {
//            return;
//        }
//        JSONObject jsonObject = new JSONObject(twoColumnWatchNextResults);
//        JSONObject jsonObject1 = new JSONObject(new JSONObject(jsonObject.get("results")).get("results"));
//        //有4个
//        JSONArray contents = new JSONArray(jsonObject1.get("contents"));
//        if (contents.isEmpty()) {
//            return;
//        }
//        //解析第一个
//        JSONObject jsonObject2 = new JSONObject(contents.get(0));
//        JSONObject videoPrimaryInfoRenderer = new JSONObject(jsonObject2.get("videoPrimaryInfoRenderer"));
//
//        //解析标题
//        JSONObject title = new JSONObject(videoPrimaryInfoRenderer.get("title"));
//        JSONArray runs1 = new JSONArray(title.get("runs"));
//        if (!runs1.isEmpty()) {
//            String text = new JSONObject(runs1.get(0)).get("text").toString();
//            if (org.springframework.util.StringUtils.isEmpty(youTuBeUserDTO.getContent())) {
//                youTuBeUserDTO.setContent(text);
//            }
//        } else {
//            return;
//        }
//        //解析观看次数
//        val viewCount = new JSONObject(videoPrimaryInfoRenderer.get("viewCount"));
//        val videoViewCountRenderer = new JSONObject(viewCount.get("videoViewCountRenderer"));
//        val viewCount1 = new JSONObject(videoViewCountRenderer.get("viewCount"));
//        String simpleText2 = Optional.ofNullable(viewCount1.get("simpleText")).map(Object::toString).orElse("0");
//        if (org.springframework.util.StringUtils.isEmpty(youTuBeUserDTO.getViewCount())) {
//            youTuBeUserDTO.setViewCount((int) Utils.stringToLong(simpleText2));
//        }
//        JSONObject videoActions = new JSONObject(videoPrimaryInfoRenderer.get("videoActions"));
//        JSONObject jsonObject3 = new JSONObject(videoActions.get("menuRenderer"));
//        if (jsonObject3.isEmpty()) {
//            return;
//        }
//        JSONObject topLevelButtons = new JSONObject(new JSONArray(jsonObject3.get("topLevelButtons")).get(0));
//        JSONObject segmentedLikeDislikeButtonRenderer = new JSONObject(topLevelButtons.get("segmentedLikeDislikeButtonRenderer"));
//        JSONObject likeButton = new JSONObject(segmentedLikeDislikeButtonRenderer.get("likeButton"));
//        JSONObject toggleButtonRenderer = new JSONObject(likeButton.get("toggleButtonRenderer"));
//        String likes = new JSONObject(toggleButtonRenderer.get("defaultText")).get("simpleText").toString();
//        String numbers = Utils.getNumbers(likes);
//        if (StrUtil.isEmpty(numbers) || numbers == "") {
//            likes = "0";
//        }
//        youTuBeUserDTO.setAttitudes((int) Utils.stringToLong(likes));
//
//        //具体发布时间
//        String dateText = new JSONObject(videoPrimaryInfoRenderer.get("dateText")).get("simpleText").toString();
//        int index = dateText.indexOf("20");
//        if (index == -1) {
//            return;
//        }
//        if (!dateText.contains("年")) {
//            dateText = Utils.formatDate(dateText);
//        }
//        dateText = dateText.substring(index);
//        if (Utils.validateLocalDateTime(youTuBeUserDTO, dateText, day, company)) {
//            return;
//        }
//        this.getSecondElement(contents, youTuBeUserDTO);
//    }
//
//    /**
//     * 解析第二个元素
//     *
//     * @param contents       contents
//     * @param youTuBeUserDTO youTuBeUserDTO
//     */
//    private void getSecondElement(JSONArray contents, RecordDTO youTuBeUserDTO) {
//        //解析第二个
//        JSONObject json1 = new JSONObject(contents.get(1));
//        JSONObject description = new JSONObject(new JSONObject(json1.get("videoSecondaryInfoRenderer")).get("description"));
//        JSONArray runs = new JSONArray(description.get("runs"));
//        StringBuilder text1 = new StringBuilder();
//
//        JSONObject attributedDescription = new JSONObject(new JSONObject(json1.get("videoSecondaryInfoRenderer")).get("attributedDescription"));
//        String content = "";
//        if (attributedDescription != null) {
//            content = attributedDescription.get("content").toString();
//        }
//
//        text1.append(content);
//        youTuBeUserDTO.setContent(text1.toString());
//        if (StringUtils.isEmpty(text1.toString())) {
//            Object videoPrimaryInfoRenderer = ((JSONObject) contents.get(0)).get("videoPrimaryInfoRenderer");
//            Object title = new JSONObject(videoPrimaryInfoRenderer).get("title");
//            JSONArray run = new JSONArray(new JSONObject(title).get("runs"));
//            for (Object r : run) {
//                if (!StringUtils.isEmpty(new JSONObject(r).get("text").toString())) {
//                    text1.append(new JSONObject(r).get("text").toString());
//                }
//            }
//            youTuBeUserDTO.setContent(text1.toString());
//        }
//        if (contents.size() > 2) {
//            //解析第三个
//            JSONObject json2 = new JSONObject(contents.get(2));
//            JSONArray objects1 = new JSONArray(new JSONObject(json2.get("itemSectionRenderer")).get("contents"));
//            if (!objects1.isEmpty()) {
//                Object commentCount = new JSONObject(new JSONObject(objects1.get(0)).get("commentsEntryPointHeaderRenderer")).get("commentCount");
//                String simpleText1 = Optional.ofNullable(new JSONObject(commentCount).get("simpleText")).map(Object::toString).orElse("0");
//                youTuBeUserDTO.setCommentsCount((int) Utils.stringToLong(simpleText1));
//            }
//        }
//        this.exitRecord(youTuBeUserDTO);
//    }
//
//    private void exitRecord(RecordDTO youTuBeUserDTO) {
//        String PICTURE_PATH = "https://tidal-exponential-1308984559.cos.ap-nanjing.myqcloud.com/pictures/youtube/";
//        LambdaQueryWrapper<RecordYoutube> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        lambdaQueryWrapper.eq(RecordYoutube::getAccountId, youTuBeUserDTO.getAccountId());
//        lambdaQueryWrapper.eq(RecordYoutube::getCommentUrl, youTuBeUserDTO.getCommentUrl());
//        lambdaQueryWrapper.last("limit 1");
//        RecordYoutube one = this.recordService.getOne(lambdaQueryWrapper);
//        RecordYoutube record = new RecordYoutube();
//        BeanUtil.copyProperties(youTuBeUserDTO, record);
//        log.info("pathUrl:" + youTuBeUserDTO.getCommentUrl());
//        if (null == one) {
//            if (!StrUtil.isEmpty(record.getContentUrl())) {
//                String pic = null;
//                try {
//                    pic = DownloadPic.download(record.getContentUrl());
//                } catch (Exception e) {
//                    log.error("上传图片失败");
//                }
//
//                record.setContentUrl(pic);
//            }
//            record.setPostId(new Snowflake().nextIdStr());
//            log.info("save ....");
//            this.recordService.save(record);
//        } else {
//            if (StrUtil.isEmpty(one.getContentUrl())) {
//                String pic = null;
//                try {
//                    pic = DownloadPic.download(record.getContentUrl());
//                } catch (Exception e) {
//                    log.error("上传图片失败");
//                }
//
//                record.setContentUrl(pic);
//            } else if (!one.getContentUrl().contains(PICTURE_PATH)) {
//                String pic = null;
//                try {
//                    pic = DownloadPic.download(record.getContentUrl());
//                } catch (Exception e) {
//                    log.error("上传图片失败");
//                }
//                record.setContentUrl(pic);
//            } else {
//                record.setContentUrl(one.getContentUrl());
//            }
//            record.setRecordId(one.getRecordId());
//            log.info("update");
//            this.recordService.updateById(record);
//        }
//    }
//
//    /**
//     * 判断是否存在这个账号
//     * 存在则修改不存在则添加
//     *
//     * @return
//     */
//    private String exitAccount(Account account) {
//        LambdaQueryWrapper<Account> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        lambdaQueryWrapper.select(Account::getAccountId, Account::getAccountPictureUrl);
//        lambdaQueryWrapper.last("limit 1");
//        lambdaQueryWrapper.eq(Account::getPlatformId, 2);
//        lambdaQueryWrapper.eq(Account::getAccountCode, account.getAccountCode());
//        Account one = this.getOne(lambdaQueryWrapper);
//        // 保存
//        if (one == null) {
//            if (!StrUtil.isEmpty(account.getAccountPictureUrl())) {
//                String path = null;
//                try {
//                    path = DownloadPic.download(account.getAccountPictureUrl());
//                } catch (Exception e) {
//                    log.error("上传图片失败");
//                }
//
//                account.setAccountPictureUrl(path);
//            }
//            // 转换图片
//            this.save(account);
//            exitAccountFan(account);
//            return account.getAccountId();
//        }
//        // 如果数据库头像是空的，获取的不是空的 转换数据库的
//        if (!StrUtil.isEmpty(one.getAccountPictureUrl()) && !one.getAccountPictureUrl().contains(SystemConstant.PICTURE_PATH)) {
//            // 转换图片
//            String path = null;
//            try {
//                path = DownloadPic.download(account.getAccountPictureUrl());
//            } catch (Exception e) {
//                log.error("上传图片失败");
//            }
//            account.setAccountPictureUrl(path);
//        } else if (StrUtil.isEmpty(one.getAccountPictureUrl())) {
//            String path = null;
//            try {
//                path = DownloadPic.download(account.getAccountPictureUrl());
//            } catch (Exception e) {
//                log.error("上传图片失败");
//            }
//            account.setAccountPictureUrl(path);
//        } else {
//            account.setAccountPictureUrl(one.getAccountPictureUrl());
//        }
//        account.setAccountId(one.getAccountId());
//        this.updateById(account);
//        exitAccountFan(account);
//        return account.getAccountId();
//    }
//
//    /**
//     * 保存粉丝数
//     *
//     * @param account 账号
//     */
//    private void exitAccountFan(Account account) {
//        LambdaQueryWrapper<Record> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        lambdaQueryWrapper.eq(Record::getAccountId, account.getAccountId());
//        LocalDateTime startTime = LocalDateTime.now().with(LocalTime.MIN);
//        LocalDateTime endTime = LocalDateTime.now().with(LocalTime.MAX);
//        lambdaQueryWrapper.between(Record::getCollectTime, startTime, endTime);
//        lambdaQueryWrapper.select(Record::getRecordId);
//        lambdaQueryWrapper.last("limit 1");
//        Record one = recordFansService.getOne(lambdaQueryWrapper);
//        Record record = new Record();
//        record.setAccountFan(account.getAccountFan());
//        record.setAccountId(account.getAccountId());
//        record.setCollectTime(LocalDateTime.now());
//        if (one != null) {
//            record.setRecordId(one.getRecordId());
//        }
//        recordFansService.saveOrUpdate(record);
//    }
//
//    private boolean getAccountDataInfo(Element doc, AccountDTO accountDTO) {
//        Element authorContainer = doc.getElementById("channel-header-container");
//        if (authorContainer == null) {
//            return false;
//        }
//        //头像
//        String avatar = Objects.requireNonNull(authorContainer.getElementById("img")).attr("src");
//        String subscribeCount = doc.select("div").select("yt-formatted-string:contains(位订阅者)").text();
//        accountDTO.setAccountPictureUrl(avatar);
//        //订阅数
//        accountDTO.setAccountFan(subscribeCount);
//        return true;
//    }
//
//    /**
//     * 获取YouTuBeUserDTO的部分信息（作者信息）
//     *
//     * @param document 元素
//     * @return YouTuBeUserDTO
//     */
//    private AccountDTO getYouTuBeUserDTOData(Document document) {
//        JSONObject scriptData = this.getJSONData(document);
//        if (scriptData == null) {
//            return null;
//        }
//        val metadata = new JSONObject(scriptData.get("metadata"));
//        val metadata1 = new JSONObject(metadata.get("channelMetadataRenderer"));
//        AccountDTO youTuBeUserData = new AccountDTO();
//
//        // ==============个人详细信息
//        //关键词
////        String keywords = Optional.ofNullable(metadata1.get("keywords")).map(Object::toString).orElse("");
////        youTuBeUserData.setKeywords(keywords);
//        //作者名称
//        String title = Optional.ofNullable(metadata1.get("title")).map(Object::toString).orElse("");
//        youTuBeUserData.setAccountName(title);
//        //描述
//        String description = Optional.ofNullable(metadata1.get("description")).map(Object::toString).orElse("");
//        youTuBeUserData.setAccountIntroduction(description);
//
//        return youTuBeUserData;
//    }
//
//    /**
//     * 抽取获取Script的公共数据
//     *
//     * @param document document
//     * @return JSONObject
//     */
//    private JSONObject getJSONData(Document document) {
//        Elements scriptData = document.select("script");
//        int index = -1;
//        for (int i = 0; i < scriptData.size(); i++) {
//            List<DataNode> dataNodes = scriptData.get(i).dataNodes();
//            if (dataNodes.isEmpty()) {
//                continue;
//            }
//            String wholeData = dataNodes.get(0).getWholeData();
//            if (!StringUtils.isEmpty(wholeData) && wholeData.contains("var ytInitialData =")) {
//                index = i;
//                break;
//            }
//        }
//        if (index == -1) {
//            return null;
//        }
//        DataNode dataNode = scriptData.get(index).dataNodes().get(0);
//        String wholeData = dataNode.getWholeData().replace("var ytInitialData =", "");
//        return new JSONObject(wholeData);
//    }
//
//    /**
//     * 懒加载实践
//     *
//     * @param driver driver
//     */
//    private void chromeDriverLazy(ChromeDriver driver, Integer day, String company) {
//        try {
//            Thread.sleep(2000);
//        } catch (Exception e) {
//            log.error(e.getMessage());
//        }
//        int i = 0;
//        // 懒加载页面,滚动获取页面元素,找到匹配内容或到达页面底部退出
//        while (true) {
//            i++;
//            // 获取滚动之前的页面数据后继续滚动页面
//            String beforeSource = driver.getPageSource();
//            // 进行页面的滚动
//            Dimension window = driver.manage().window().getSize();
//
//            // 获取3天前断点
//            Cookie c1 = new Cookie("LOGIN_INFO", "AFmmF2swRQIhAObkvi-ApS24GNH4PA1T-TR66t1h0xfg4lo2lxJgp6SfAiAP9u0GoSsLo0oDaOpxjiSrZU5OiQcEYt-QD_A0lYOkGg:QUQ3MjNmd2RhUXh5aG1XR0I1cG1meUNvbm8wbkZyNk9oQlRvcllydjdPLVRQQ1NScm9xTmgxMjIwNXBOeTBOdUtGUWxWWmRLZ1NibzlmeEY4WHEwbFRPMTZEUXd6b3k4OUkxZzJPNWZVQ1pnNGhxRldVVDROUlNtaHlwVjkyVnY2M0JlWmdnZTVmeW5VVk1YWFpoMzhhZ2RieThpZi1YMEpR");
//            driver.manage().addCookie(c1);
//            Document document = Jsoup.parse(driver.getPageSource(), "utf-8");
//            Element doc = document.body();
//            Elements elements = doc.select("#dismissible");
//            boolean flag = false;
//            for (Element element : elements) {
//                boolean f;
//                Elements elementsByClass = element.getElementsByClass("inline-metadata-item style-scope ytd-video-meta-block");
//                if (elementsByClass.text().contains("首播时间")) {
//                    continue;
//                }
//                if (elementsByClass.isEmpty()) {
//                    continue;
//                }
//                String time = elementsByClass.get(1).text();
//                f = Utils.validateTime(time, day, company);
//                // 如果第一个就没有天就可以结束了
//                if (!f) {
//                    // 有一个元素不符合就结束
//                    flag = true;
//                    break;
//                }
//            }
//            if (flag) {
//                break;
//            }
//            //
//            try {
//                Thread.sleep(3000);
//            } catch (Exception e) {
//                log.error(e.getMessage());
//            }
//            long height = window.height * i;
//            ((JavascriptExecutor) driver).executeScript("window.scrollTo(0," + height + ")");
//            // 获取滚动页面后的元素
//            String afterSource = driver.getPageSource();
//            // 比较滚动前和滚动后的页面元素,一样则代表到达页面底部,退出循环
//            if (beforeSource.equals(afterSource)) {
//                break;
//            }
//        }
//    }
//}
